package main

import "fmt"

type HeroNode struct {
	no   int
	name string
	pre  *HeroNode
	next *HeroNode
}

func main() {
	// 先创建头结点
	head := &HeroNode{}

	// 创建一个新HeroNode
	hero1 := &HeroNode{
		no:   1,
		name: "sj",
	}

	hero2 := &HeroNode{
		no:   2,
		name: "aq",
	}

	hero3 := &HeroNode{
		no:   3,
		name: "zz",
	}
	/*InsertHeroNode(head,hero1)
	InsertHeroNode(head,hero3)
	InsertHeroNode(head,hero2)*/
	InsertSortedHeroNode(head, hero2)
	InsertSortedHeroNode(head, hero3)
	InsertSortedHeroNode(head, hero1)
	ListAll(head)
	/*fmt.Println("===删除===")
	// 删除
	DeleteNode(head,2)
	ListAll(head)*/
}

// 第一种插入 尾插
func InsertHeroNode(head *HeroNode, newNode *HeroNode) {
	// 1 先找到尾结点
	// 创建辅助结点
	temp := head
	for {
		if temp.next == nil {
			break
		}
		temp = temp.next
	}
	// 将 newNode加入到最后
	temp.next = newNode
	newNode.pre = temp
}

func InsertSortedHeroNode(head *HeroNode, newNode *HeroNode) {
	// 1 先找到适当的阶段
	// 创建辅助结点
	// 让插入节点的no和temp.next的no比较
	temp := head
	flag := true
	for {
		if temp.next == nil {
			break
		} else if temp.next.no > newNode.no {
			// 说明newNode应该插入到temp后面
			break
		} else if temp.next.no == newNode.no {
			// no重复 不插入
			flag = false
			break
		}
		temp = temp.next
	}
	if !flag {
		fmt.Println("no已存在")
	} else {
		// 先让后面节点指向newNode,再让temp指向mewNode
		newNode.next = temp.next
		newNode.pre = temp
		if temp.next != nil {
			temp.next.pre = newNode
		}
		temp.next = newNode
	}

}

func DeleteNode(head *HeroNode, id int) {
	temp := head
	flag := false
	for {
		if temp.next == nil {
			break
		} else if temp.next.no == id {
			// 说明已经找到
			flag = true
			break
		}
		temp = temp.next
	}
	if flag {
		// 删除
		temp.next = temp.next.next
		if temp.next != nil {
			temp.next.pre = temp
		}

	} else {
		fmt.Println("指定id不存在")
	}
}

// 仍然和单向的一样
func ListAll(head *HeroNode) {
	// 创建辅助结点
	temp := head
	if temp.next == nil {
		fmt.Println("空链表")
		return
	}
	for {
		fmt.Printf("节点信息:%d,%s\n",
			temp.next.no, temp.next.name)
		temp = temp.next
		if temp.next == nil {
			break
		}
	}
}
